#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e4 + 10;

int n, m, w;
int c[N], d[N];
vector<int> edges[N];

bool st[N];
int p[N], v[N], cnt;

int f[N];

void dfs(int x)
{
	st[x] = true;
	p[cnt] += c[x];
	v[cnt] += d[x];
	for(auto &e : edges[x])
	{
		if(!st[e]) dfs(e);
	}
}

int main()
{
	cin >> n >> m >> w;
	for(int i = 1;i <= n;i ++) cin >> c[i] >> d[i];
	for(int i = 1;i <= m;i ++)
	{
		int u, v; cin >> u >> v;
		edges[u].push_back(v);
		edges[v].push_back(u);
	}
	for(int i = 1;i <= n;i ++)
	{
		if(!st[i])
		{
			cnt ++;
			dfs(i);
		}
	}
	// 01 背包
	for(int i = 1;i <= n;i ++)
		for(int j = w;j >= p[i];j --)
			f[j] = max(f[j], f[j - p[i]] + v[i]);
	cout << f[w] << endl;
	return 0;
}


// #include <bits/stdc++.h>
// using namespace std;
// typedef long long LL;
// const int N = 1e4 + 10;

// int n, m, w;
// int p[N], v[N];
// bool st[N];
// int fa[N];
// int cnt;
// int f[N];

// int find(int x)
// {
// 	return fa[x] == x ? x : fa[x] = find(fa[x]);
// }

// int main()
// {
// 	cin >> n >> m >> w;
// 	for(int i = 1;i <= n;i ++) cin >> p[i] >> v[i];
// 	for(int i = 1;i <= n;i ++) fa[i] = i;
// 	for(int i = 1;i <= m;i ++)
// 	{
// 		int x, y; cin >> x >> y;
// 		int fx = find(x), fy = find(y);
// 		fa[fy] = fx;
// 	}
// 	for(int i = 1;i <= n;i ++)
// 	{
// 		int f = find(i);
// 		if(f != i)
// 		{
// 			p[f] += p[i];
// 			v[f] += v[i];
// 			st[i] = true;
// 		}
// 	}
// 	for(int i = 1;i <= n;i ++)
// 	{
// 		if(!st[i])
// 		{
// 			cnt ++;
// 			p[cnt] = p[i];
// 			v[cnt] = v[i];
// 		}
// 	}
// 	for(int i = 1;i <= cnt;i ++)
// 	{
// 		for(int j = w;j >= p[i];j --)
// 		{
// 			f[j] = max(f[j], f[j - p[i]] + v[i]);
// 		}
// 	}
// 	cout << f[w] << endl;
// 	return 0;
// }